﻿using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Locadora.TOB;
using Locadora.BLL;
using System.Web.Security;
using MvcMembership.Helpers;
using IMDBDLL;
namespace MvcMembership.Controllers
{
    public class InsertError
    {
        public string ErrorMessage { get; set; }
        public string OriginalFirstName { get; set; }
        public string OriginalLastName { get; set; }
    }
    [HandleError]
    public class FilmeController : Controller
    {
        InsertError error = new InsertError();

        #region Listar

        public ActionResult Pesquisa()
        {
            ViewData["Title"] = "Pesquisar Filmes";
            ViewData["Message"] = "";
            return View();
        }
        public ActionResult Pesquisar()
        {
            ViewData["Title"] = "Lista de Filmes";
            ViewData["Message"] = "";

            //List<TB_DVD> filmes = DvdBLL.Listar();
            // return View(filmes);

            string pageString = "";

            try
            {
                pageString = Request.QueryString["pagina"];
            }
            catch (Exception)
            {
                pageString = null;
            }

            int page = (String.IsNullOrEmpty(pageString)) ? 1 : Int32.Parse(pageString);

            int totalComentarios = DvdBLL.GetTotalDvds();

            Pagination pagination = new Pagination(true);

            pagination.BaseUrl = "/Filme/Pesquisar/";
            pagination.TotalRows = totalComentarios;
            pagination.CurPage = page;
            pagination.PerPage = 10;

            pagination.PrevLink = "Prev";
            pagination.NextLink = "Next";

            string pageLinks = pagination.GetPageLinks();

            int start = (page - 1) * pagination.PerPage;
            int offset = pagination.PerPage;

            List<TB_DVD> users = DvdBLL.GetDvds(start, offset);

            ViewData["totalUsers"] = totalComentarios;
            ViewData["users"] = users;
            ViewData["pageLinks"] = pageLinks;

            return View();

        }
        #endregion

        #region Edição
        public ActionResult Editar(decimal id)
        {
            InsertError err = TempData["error"] as InsertError;
            if (err != null)
            {
                // If there is error data from the previous action, display it.
                ViewData["ErrorMessage"] = err.ErrorMessage;
            }

            TB_DVD dvd = DvdBLL.Listar(id);
            ViewData["Id"] = dvd.CO_SEQ_DVD;
            ViewData["Titulo"] = dvd.DS_TITULO;
            ViewData["Ator"] = dvd.DS_ATOR_PRINCIPAL;
            ViewData["Diretor"] = dvd.DS_DIRETOR;
            ViewData["Duracao"] = dvd.NU_DURACAO;
            ViewData["Nota"] = dvd.NU_NOTA;

            var tipos = TipoDvdBLL.Listar();
            ViewData["Tipo"] = new SelectList(tipos, "CO_SEQ_TIPO_DVD", "DS_TIPO", dvd.CO_TIPO_DVD);
            var generos = GeneroTOB.GetGeneros();
            ViewData["Genero"] = new SelectList(generos, "CO_GENERO", "DS_GENERO", dvd.CO_GENERO);
            return View();
        }

        //// 
        //// POST: /Products/Edit/5 
        //[AcceptVerbs(HttpVerbs.Post)]
        //public ActionResult Edit(int id, FormCollection collection)
        //{
        //    try
        //    {
        //        TB_DVD dvd = DvdBLL.Listar(id);
        //        //UpdateModel ( dvd, new string[] {"Title","Director", "DateReleased"}, collection.ToValueProvider() ); 
        //        //_db.SaveChanges(); 
        //        return RedirectToAction("Index");
        //    }
        //    catch
        //    {
        //        return View();
        //    }
        //}


        public ActionResult Edit(decimal id, string titulo, string ator, string diretor, string duracao, string nota, string tipo, string genero)
        {
            try
            {
                ValidarParametros(id.ToString(), titulo, duracao, nota, tipo, genero);

                TB_DVD dvd = DvdBLL.Listar(id);
                dvd.DS_TITULO = titulo;
                dvd.DS_ATOR_PRINCIPAL = ator;
                dvd.DS_DIRETOR = diretor;
                dvd.NU_DURACAO = Convert.ToDecimal(duracao);
                dvd.NU_NOTA = int.Parse(nota);
                dvd.CO_TIPO_DVD = int.Parse(tipo);
                dvd.CO_GENERO = int.Parse(genero);
                DvdBLL bll = new DvdBLL(dvd);
                bll.Update();
                return RedirectToAction("Pesquisar");
            }
            catch (Exception ex)
            {
                InsertError error = new InsertError();
                error.ErrorMessage = ex.Message;
                TempData["error"] = error;
                return RedirectToAction("Editar/" + id);
            }
        }

        #endregion

        #region Cadastro
        public ActionResult Cadastrar()
        {
            ViewData["Title"] = "Cadastrar Filmes";

            InsertError err = TempData["error"] as InsertError;
            if (err != null)
            {
                // If there is error data from the previous action, display it.
                ViewData["ErrorMessage"] = err.ErrorMessage;
            }

            var tipos = TipoDvdBLL.Listar();
            var generos = GeneroTOB.GetGeneros();
            ViewData["Tipo"] = new SelectList(tipos, "CO_SEQ_TIPO_DVD", "DS_TIPO");
            ViewData["Genero"] = new SelectList(generos, "CO_GENERO", "DS_GENERO");

            return View();
        }

        public ActionResult Cadastra(string coUsuario, string titulo, string ator, 
            string diretor, string duracao, string nota, string tipo, string genero)
        {
            try
            {
                ValidarParametros(coUsuario, titulo, duracao, nota, tipo, genero);
                TB_DVD dvd = new TB_DVD
                                 {
                                     DS_TITULO = titulo,
                                     DS_ATOR_PRINCIPAL = ator,
                                     DS_DIRETOR = diretor,
                                     NU_DURACAO = Convert.ToDecimal(duracao),
                                     NU_NOTA = int.Parse(nota),
                                     CO_TIPO_DVD = int.Parse(tipo),
                                     CO_PROPRIETARIO = coUsuario,
                                     NU_QUANTIDADE = 1,
                                     CO_GENERO = int.Parse(genero)
                                 };
                DvdBLL bll = new DvdBLL(dvd);
                bll.Inserir();
                //return "ok";
                return RedirectToAction("Pesquisar");
                //return View();
            }
            catch (Exception ex)
            {
                InsertError error = new InsertError();
                error.ErrorMessage = ex.Message;
                TempData["error"] = error;
                return RedirectToAction("Cadastrar");
                //return "<script>alert('Erro na Página');</script>";
                //return View();
            }
        }

        #endregion

        #region Locados
        public ActionResult Locacao(string id)
        {
            InsertError err = TempData["error"] as InsertError;
            if (err != null)
            {
                // If there is error data from the previous action, display it.
                ViewData["ErrorMessage"] = err.ErrorMessage;
            }

            if (id == null || decimal.Parse(id) <= 0)
                return RedirectToAction("Pesquisar");

            ViewData["Title"] = "Locar Filme";
            ViewData["Message"] = "Locação de Filmes!";

            TB_DVD dvd = DvdBLL.Listar(decimal.Parse(id));
            ViewData["Id"] = dvd.CO_SEQ_DVD;
            ViewData["Titulo"] = dvd.DS_TITULO;
            ViewData["Ator"] = dvd.DS_ATOR_PRINCIPAL;
            ViewData["Diretor"] = dvd.DS_DIRETOR;
            ViewData["Duracao"] = dvd.NU_DURACAO;
            ViewData["Nota"] = dvd.NU_NOTA;
            ViewData["Tipo"] = dvd.TB_TIPO_DVD.DS_TIPO;
            
            ViewData["TextoSubmit"] = "Solicitar"; 
            ViewData["Situacao"] = 0;
            
            if (dvd.FL_LOCADO)
            {
                ViewData["Situacao"] = (int)Locadora.TOB.Enumeracao.SituacaoLocacao.Reserva;
                ViewData["TextoSubmit"] = "Reservar";
            }
            DvdBLL bll = new DvdBLL();
            ViewData["YouTube"] = bll.GetYouTubeVideo(dvd.DS_TITULO);
            
            return View();
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult LocacaoNome(string nome)
        {
            InsertError err = TempData["error"] as InsertError;
            if (err != null)
            {
                // If there is error data from the previous action, display it.
                ViewData["ErrorMessage"] = err.ErrorMessage;
            }

            if (nome == null || nome==string.Empty)
                return RedirectToAction("Pesquisar");

            ViewData["Title"] = "Locar Filme";
            ViewData["Message"] = "Locação de Filmes!";

            TB_DVD dvd = DvdBLL.Listar(nome);
            
            return RedirectToAction("Locacao/" + dvd.CO_SEQ_DVD.ToString());

            //return View();
        }

        public ActionResult Locar(decimal id, string coUsuario, int situacao)
        {
            try
            {
                TB_DVD dvd = new TB_DVD();
                dvd = DvdBLL.Listar(id);
                //dvd.CO_SEQ_DVD = id;
                dvd.FL_LOCADO = true;
                DvdBLL bll = new DvdBLL(dvd);
                UsuarioTOB proprietario= new UsuarioTOB();
                UsuarioTOB solicitante = new UsuarioTOB();

                proprietario.CO_USUARIO = dvd.CO_PROPRIETARIO;
                proprietario.DS_NOME = Membership.GetUser(new Guid(dvd.CO_PROPRIETARIO)).UserName;
                proprietario.DS_EMAIL = Membership.GetUser(new Guid(dvd.CO_PROPRIETARIO)).Email;


                solicitante.CO_USUARIO = coUsuario;
                solicitante.DS_NOME = Membership.GetUser(new Guid(coUsuario)).UserName;
                solicitante.DS_EMAIL = Membership.GetUser(new Guid(coUsuario)).Email;
                if (situacao != 5)
                {
                    bll.AlugarFilme(proprietario, solicitante);
                }
                else
                {
                    bll.ReservarFilme(proprietario, solicitante);
                }

                return RedirectToAction("Pesquisar");
            }
            catch (Exception ex)
            {
                InsertError error = new InsertError();
                error.ErrorMessage = ex.Message;
                TempData["error"] = error;
                return RedirectToAction("Locacao/" + id);
            }
        }
        #endregion

        #region Devolução
        public ActionResult Devolucao()
        {
            InsertError err = TempData["error"] as InsertError;
            if (err != null)
            {
                // If there is error data from the previous action, display it.
                ViewData["ErrorMessage"] = err.ErrorMessage;
            }

            string id = HttpContext.User.Identity.Name;
            var user = Membership.GetUser(id);
            ViewData["Title"] = "Devolver Filme";
            List<LocacaoTOB> locacoes = LocacaoBLL.IqueryableListarLocadoByUsuario(user.ProviderUserKey.ToString());
            ViewData["totalUsers"] = locacoes!=null?locacoes.Count:0;
            return View(locacoes);
        }

        public ActionResult Devolver(decimal id, decimal coLocacao)
        {
            InsertError err = TempData["error"] as InsertError;
            if (err != null)
            {
                // If there is error data from the previous action, display it.
                ViewData["ErrorMessage"] = err.ErrorMessage;
            }

            ViewData["Title"] = "Devolver Filme";
            TB_DVD dvd = DvdBLL.Listar(id);
            ViewData["Id"] = dvd.CO_SEQ_DVD;
            ViewData["Titulo"] = dvd.DS_TITULO;
            ViewData["Ator"] = dvd.DS_ATOR_PRINCIPAL;
            ViewData["Diretor"] = dvd.DS_DIRETOR;
            ViewData["Duracao"] = dvd.NU_DURACAO;
            ViewData["Nota"] = dvd.NU_NOTA;
            ViewData["Tipo"] = dvd.CO_TIPO_DVD;
            ViewData["CoLocacao"] = coLocacao;
            ViewData["Quantidade"] = dvd.NU_QUANTIDADE;

            return View();
        }

        public ActionResult Devolve(decimal id, string comentario, string nota, string coUsuario, string notaAtual, decimal coLocacao, int quantidade)
        {
            try
            {

                TB_DVD dvd = new TB_DVD();
                dvd.CO_SEQ_DVD = id;
                dvd.NU_NOTA = (int.Parse(nota.Replace('/', ' ')) + int.Parse(notaAtual)) / (quantidade + 1);
                dvd.FL_LOCADO = false;
                dvd.NU_QUANTIDADE = quantidade + 1;

                DvdBLL bll = new DvdBLL(dvd);
                bll.Devolver(comentario, coUsuario, coLocacao);
                return RedirectToAction("Pesquisar");
            }

            catch (Exception ex)
            {
                InsertError error = new InsertError();
                error.ErrorMessage = ex.Message;
                TempData["error"] = error;
                return RedirectToAction("Devolver/" + id + "?coLocacao=" + coLocacao);
            }
        }

        public ActionResult Cancelar(decimal id, decimal coLocacao)
        {
            InsertError err = TempData["error"] as InsertError;
            try
            {
                if (err != null)
                {
                    // If there is error data from the previous action, display it.
                    ViewData["ErrorMessage"] = err.ErrorMessage;
                }
                LocacaoBLL bll = new LocacaoBLL();
                bll.Cancelar(id, coLocacao);
                return RedirectToAction("Devolucao");
            }
            catch (Exception ex)
            {
                InsertError error = new InsertError();
                error.ErrorMessage = ex.Message;
                TempData["error"] = error;
                return RedirectToAction("Devolucao");
            }
        }

        #endregion

        #region Comentarios
        
        public ActionResult Comentario(decimal id)
        {
            //List<TB_COMENTARIO> comentarios = ComentarioBLL.ListarByDvd(id);
            //return View(comentarios);

            string pageString = "";

            try
            {
                pageString = Request.QueryString["pagina"];
            }
            catch (Exception)
            {
                pageString = null;
            }

            int page = (String.IsNullOrEmpty(pageString)) ? 1 : Int32.Parse(pageString);

            //UserModel userModel = new UserModel();

            int totalComentarios = ComentarioBLL.GetTotalComentarios(id);

            Pagination pagination = new Pagination(true);

            pagination.BaseUrl = "/Filme/Comentario/" + id;
            pagination.TotalRows = totalComentarios;
            pagination.CurPage = page;
            pagination.PerPage = 15;

            pagination.PrevLink = "Prev";
            pagination.NextLink = "Next";

            string pageLinks = pagination.GetPageLinks();

            int start = (page - 1) * pagination.PerPage;
            int offset = pagination.PerPage;

            List<TB_COMENTARIO> users = ComentarioBLL.GetComentarios(start, offset, id);

            ViewData["title"] = "Pagination in Asp.Net Mvc";
            ViewData["totalUsers"] = totalComentarios;
            ViewData["users"] = users;
            ViewData["pageLinks"] = pageLinks;

            return View();

        }
        #endregion

        #region Solicitados
        //Tela solicitação
        public ActionResult Solicitacao()
        {
            string id = HttpContext.User.Identity.Name;
            var user = Membership.GetUser(id);
            ViewData["Title"] = "Filme(s) Solicitado(s)";
            //List<LocacaoTOB> locacoes = LocacaoBLL.IqueryableListarSolicitadoParaUsuario(user.ProviderUserKey.ToString());
            
            //--
            string pageString = "";

            try
            {
                pageString = Request.QueryString["pagina"];
            }
            catch (Exception)
            {
                pageString = null;
            }

            int page = (String.IsNullOrEmpty(pageString)) ? 1 : Int32.Parse(pageString);

            //UserModel userModel = new UserModel();

            int totalComentarios = LocacaoBLL.GetTotalLocacoes(user.ProviderUserKey.ToString());

            Pagination pagination = new Pagination(true);

            pagination.BaseUrl = "/Filme/Solicitacao";
            pagination.TotalRows = totalComentarios;
            pagination.CurPage = page;
            pagination.PerPage = 10;

            pagination.PrevLink = "Prev";
            pagination.NextLink = "Next";

            string pageLinks = pagination.GetPageLinks();

            int start = (page - 1) * pagination.PerPage;
            int offset = pagination.PerPage;

            List<LocacaoTOB> users = LocacaoBLL.IqueryableListarSolicitadoParaUsuario(start, offset, user.ProviderUserKey.ToString());

            ViewData["title"] = "Pagination in Asp.Net Mvc";
            ViewData["totalUsers"] = totalComentarios;
            ViewData["users"] = users;
            ViewData["pageLinks"] = pageLinks;

            return View();

           
        }

        public ActionResult Aprovar(decimal id, decimal coLocacao)
        {
            InsertError err = TempData["error"] as InsertError;
            try
            {
                if (err != null)
                {
                    // If there is error data from the previous action, display it.
                    ViewData["ErrorMessage"] = err.ErrorMessage;
                }
                LocacaoBLL bll = new LocacaoBLL();
                bll.Aprovar(id, coLocacao);
                return RedirectToAction("Solicitacao");
            }
            catch (Exception ex)
            {
                InsertError error = new InsertError();
                error.ErrorMessage = ex.Message;
                TempData["error"] = error;
                return RedirectToAction("Solicitacao");
            }

        }

        public ActionResult NaoAprovar(decimal id, decimal coLocacao)
        {
            InsertError err = TempData["error"] as InsertError;
            try
            {
                if (err != null)
                {
                    // If there is error data from the previous action, display it.
                    ViewData["ErrorMessage"] = err.ErrorMessage;
                }
                LocacaoBLL bll = new LocacaoBLL();

                TB_DVD dvd = DvdBLL.Listar(id);
                UsuarioTOB proprietario = new UsuarioTOB();
                UsuarioTOB solicitante = new UsuarioTOB();

                proprietario.CO_USUARIO = dvd.CO_PROPRIETARIO;
                proprietario.CO_USUARIO = dvd.CO_PROPRIETARIO;
                proprietario.DS_NOME = Membership.GetUser(new Guid(dvd.CO_PROPRIETARIO)).UserName;
                proprietario.DS_EMAIL = Membership.GetUser(new Guid(dvd.CO_PROPRIETARIO)).Email;

                TB_LOCACAO locacao= LocacaoBLL.Listar(coLocacao);

                solicitante.CO_USUARIO = locacao.CO_USUARIO;
                solicitante.DS_NOME = Membership.GetUser(new Guid(locacao.CO_USUARIO)).UserName;
                solicitante.DS_EMAIL = Membership.GetUser(new Guid(locacao.CO_USUARIO)).Email;


                bll.NaoAprovar(id, coLocacao, proprietario, solicitante);
                return RedirectToAction("Solicitacao");
            }
            catch (Exception ex)
            {
                InsertError error = new InsertError();
                error.ErrorMessage = ex.Message;
                TempData["error"] = error;
                return RedirectToAction("Solicitacao");
            }

        }

        #endregion

        #region Métodos
        private static void ValidarParametros(string coUsuario, string titulo, string duracao, string nota, string tipo, string genero)
        {
            string mensagem = string.Empty;

            if (string.IsNullOrEmpty(coUsuario))
            {
                mensagem += "Usuário não informado;<br>";
            }
            if (string.IsNullOrEmpty(titulo))
            {
                mensagem += "Título não informado;<br>";
            }
            if (string.IsNullOrEmpty(duracao))
            {
                mensagem += "Duração não informada;<br>";
            }
            else
            {
                decimal valornota = 0;
                if (!decimal.TryParse(duracao, out valornota))
                {
                    mensagem += "Duração não possue valor válido;<br>";
                }
            }
            if (string.IsNullOrEmpty(nota))
            {
                mensagem += "Nota não informada;<br>";
            }
            else
            {
                if (int.Parse(nota) < 1 && int.Parse(nota) > 5)
                {
                    mensagem += "Nota fora do intervalo;<br>";
                }
            }
            if (string.IsNullOrEmpty(tipo))
            {
                mensagem += "Tipo não informado;<br>";
            }
            if (string.IsNullOrEmpty(genero))
            {
                mensagem += "Gênero não informado;<br>";
            }

            if (mensagem != string.Empty)
            {
                throw new Exception(mensagem);
            }
        }

        public JsonResult ListaFilmeIMDB(string titulo)
        {
            DvdBLL bll = new DvdBLL();
            List<IMDbLink> lista = bll.GetListaFilmeIMDB(titulo);
            return Json(lista);
        }

        public JsonResult GetInfoFilmeIMDB(string urlFilme)
        {
            DvdBLL bll = new DvdBLL();
            IMDbTitle titulo = bll.GetInfoFilmeIMDB(urlFilme);
            return Json(titulo);
        }
        #endregion

        #region Classificação

        public ActionResult Classificacao(string id)
        {
            //List<TB_COMENTARIO> comentarios = ComentarioBLL.ListarByDvd(id);
            //return View(comentarios);
            ViewData["Id"] = id;

            string pageString = "";

            try
            {
                pageString = Request.QueryString["pagina"];
            }
            catch (Exception)
            {
                pageString = null;
            }

            int page = (String.IsNullOrEmpty(pageString)) ? 1 : Int32.Parse(pageString);

            //UserModel userModel = new UserModel();

            int totalComentarios = ClassificacaoBLL.GetTotalClassificacao(id);
            int totalPositivas = ClassificacaoBLL.GetTotalClassificacaoPos(id);
            int totalNegativas = ClassificacaoBLL.GetTotalClassificacaoNeg(id);

            Pagination pagination = new Pagination(true);

            pagination.BaseUrl = "/Filme/Classificacao/" + id;
            pagination.TotalRows = totalComentarios;
            pagination.CurPage = page;
            pagination.PerPage = 15;

            pagination.PrevLink = "Prev";
            pagination.NextLink = "Next";

            string pageLinks = pagination.GetPageLinks();

            int start = (page - 1) * pagination.PerPage;
            int offset = pagination.PerPage;

            List<TB_CLASSIFICACAO> users = ClassificacaoBLL.GetClassificacao(start, offset, id);

            ViewData["title"] = "Pagination in Asp.Net Mvc";
            ViewData["totalUsers"] = totalComentarios;
            ViewData["users"] = users;
            ViewData["pageLinks"] = pageLinks;
            ViewData["Positiva"] = totalPositivas==0?0:(totalPositivas * 100) / totalComentarios;
            ViewData["Negativa"] = totalNegativas==0?0:(totalNegativas * 100) / totalComentarios;

            return View();

        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Classificar(string id, decimal coLocacao, string titulo)
        {
            InsertError err = TempData["error"] as InsertError;
            if (err != null)
            {
                // If there is error data from the previous action, display it.
                ViewData["ErrorMessage"] = err.ErrorMessage;
            }

            ViewData["Title"] = "Classificação de Locador";
            ViewData["Id"] = id;
            ViewData["Titulo"] = titulo;
            ViewData["CoLocacao"] = coLocacao;
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        [ActionName("Classifica")]
        public ActionResult Classifica(string id, string tipo, string comentario, string coUsuario, decimal coLocacao)
        {
            try{
                TB_CLASSIFICACAO tb = new TB_CLASSIFICACAO();
                tb.CO_LOCACAO = coLocacao;
                tb.DS_COMENTARIO = comentario;
                tb.TP_CLASSIFICACAO = tipo.Replace('/', ' ').Trim()=="0"?false:true;
                tb.GD_USUARIO = id;
                tb.DT_CADASTRO = DateTime.Today;

                ClassificacaoBLL bll =new ClassificacaoBLL(tb);
                bll.Inserir();
             }
            catch (Exception ex)
            {
                InsertError error = new InsertError();
                error.ErrorMessage = ex.Message;
                TempData["error"] = error;
                return RedirectToAction("Classificar/"+ id + "?coLocacao=" + coLocacao);
            }
            return RedirectToAction("Classificacao/"+id);
        }
        #endregion

    }

}
